package com.huawei.codecheck.uccp.plugin.cangjie;

import java.util.HashMap;

public class CangjieInfo {
    public static HashMap<String, String> DESCRIPTION_MAP = new HashMap();
    private String file;  // 文件名
    private int line;     // 文件行号
    private int column;   // 文件行号列号
    private String analyzerName;   // 
    private String description;
    private String defectLevel;
    private String defectType;
    private String language;

    public CangjieInfo() {
    }

    public String getFile() {
        return this.file;
    }

    public int getLine() {
        return this.line;
    }

    public int getColumn() {
        return this.column;
    }

    public String getAnalyzerName() {
        return this.analyzerName;
    }

    public String getDescription() {
        return this.description;
    }

    public String getDefectLevel() {
        return this.defectLevel;
    }

    public String getDefectType() {
        return this.defectType;
    }

    public String getLanguage() {
        return this.language;
    }

    public void setFile(String file) {
        this.file = file;
    }

    public void setLine(int line) {
        this.line = line;
    }

    public void setColumn(int column) {
        this.column = column;
    }

    public void setAnalyzerName(String analyzerName) {
        this.analyzerName = analyzerName;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public void setDefectLevel(String defectLevel) {
        this.defectLevel = defectLevel;
    }

    public void setDefectType(String defectType) {
        this.defectType = defectType;
    }

    public void setLanguage(String language) {
        this.language = language;
    }

    static {
        DESCRIPTION_MAP.put("G.NAM.01", "包名采用全小写单词，允许包含数字和下划线。");
        DESCRIPTION_MAP.put("G.NAM.02", "源文件名采用全小写加下划线风格。");
        DESCRIPTION_MAP.put("G.NAM.03", "接口，类，struct、枚举类型和枚举成员构造，类型别名，采用大驼峰命名。");
        DESCRIPTION_MAP.put("G.NAM.04", "函数名称应采用小驼峰命名。");
        DESCRIPTION_MAP.put("G.NAM.05", "let 的全局变量和 static let 变量的名称采用全大写。");
        DESCRIPTION_MAP.put("G.FMT.01", "源文件编码格式（包括注释）必须是 UTF-8。");
        DESCRIPTION_MAP.put("G.FMT.15", "禁止省略浮点数小数点前的 0。");
        DESCRIPTION_MAP.put("G.DCL.01", "避免遮盖（shadow）。");
        DESCRIPTION_MAP.put("G.FUN.01", "函数功能要单一。");
        DESCRIPTION_MAP.put("G.FUN.02", "禁止函数有未被使用的参数。");
        DESCRIPTION_MAP.put("G.FUN.03", "避免在无关的函数之间重用名字，构成重载。");
        DESCRIPTION_MAP.put("G.CLS.01", "override 父类函数时不要增加函数的可访问性。");
        DESCRIPTION_MAP.put("G.ITF.01", "对于需要原地修改对象自身的抽象函数，尽量使用 mut 修饰，以支持 struct 类型实现或扩展该接口。");
        DESCRIPTION_MAP.put("G.ITF.02", "尽量在类型定义处就实现接口，而不是通过扩展实现接口。");
        DESCRIPTION_MAP.put("G.ITF.03", "类型定义时避免同时声明实现父接口和子接口。");
        DESCRIPTION_MAP.put("G.ITF.04", "尽量通过泛型约束使用接口，而不是直接将接口作为类型使用。");
        DESCRIPTION_MAP.put("G.OPR.01", "尽量避免违反使用习惯的操作符重载。");
        DESCRIPTION_MAP.put("G.OPR.02", "尽量避免在枚举类型内定义()操作符重载函数。");
        DESCRIPTION_MAP.put("G.ENU.01", "避免枚举的构造成员与顶层元素同名。");
        DESCRIPTION_MAP.put("G.ENU.02", "尽量避免不同的 enum 的 constructor 之间不必要的重载。");
        DESCRIPTION_MAP.put("G.VAR.01", "优先使用不可变变量。");
        DESCRIPTION_MAP.put("G.TYP.03", "判断变量是否为 NaN 时必须使用 isNaN() 方法。");
        DESCRIPTION_MAP.put("G.EXP.01", "match 表达式同一层尽量避免不同类别的 pattern 混用。");
        DESCRIPTION_MAP.put("G.EXP.02", "不要期望浮点运算得到精确的值。");
        DESCRIPTION_MAP.put("G.EXP.03", "&& 、 ||、? 和 ?? 操作符的右侧操作数不要包含副作用。");
        DESCRIPTION_MAP.put("G.EXP.04", "尽量避免副作用发生依赖于操作符的求值顺序。");
        DESCRIPTION_MAP.put("G.EXP.05", "用括号明确表达式的操作顺序，避免过分依赖默认优先级。");
        DESCRIPTION_MAP.put("G.EXP.06", "Bool 类型比较应避免多余的 == 或 !=。");
        DESCRIPTION_MAP.put("G.EXP.07", "比较两个表达式时，左侧倾向于变化，右侧倾向于不变。");
        DESCRIPTION_MAP.put("G.ERR.02", "防止通过异常抛出的内容泄露敏感信息。");
        DESCRIPTION_MAP.put("G.ERR.03", "避免对 Option 类型使用 getorthrow 函数。");
        DESCRIPTION_MAP.put("G.ERR.04", "不要使用 return、break、continue 或抛出异常使 finally 块非正常结束。");
        DESCRIPTION_MAP.put("G.PKG.01", "避免在 import 声明中使用通配符*。");
        DESCRIPTION_MAP.put("G.CON.01", "禁止将系统内部使用的锁对象暴露给不可信代码。");
        DESCRIPTION_MAP.put("P.01", "使用相同的顺序请求锁，避免死锁。");
        DESCRIPTION_MAP.put("G.CON.02", "在异常可能出现的情况下，保证释放已持有的锁。");
        DESCRIPTION_MAP.put("G.CON.03", "禁止使用非线程安全的函数来覆写线程安全的函数。");
        DESCRIPTION_MAP.put("P.02", "避免数据竞争（data race）。");
        DESCRIPTION_MAP.put("G.CHK.01", "跨信任边界传递的不可信数据使用前必须进行校验。");
        DESCRIPTION_MAP.put("G.CHK.02", "禁止直接使用外部数据记录日志。");
        DESCRIPTION_MAP.put("G.CHK.03", "使用外部数据构造的文件路径前必须进行校验，校验前必须对文件路径进行规范化处理。");
        DESCRIPTION_MAP.put("G.CHK.04", "禁止直接使用不可信数据构造正则表达式。");
        DESCRIPTION_MAP.put("G.FIO.01", "临时文件使用完毕必须及时删除。");
        DESCRIPTION_MAP.put("G.SER.01", "禁止序列化未加密的敏感数据。");
        DESCRIPTION_MAP.put("G.SER.02", "防止反序列化被利用来绕过构造方法中的安全操作。");
        DESCRIPTION_MAP.put("G.SER.03", "保证序列化和反序列化的变量类型一致。");
        DESCRIPTION_MAP.put("G.SEC.01", "进行安全检查的方法禁止声明为open。");
        DESCRIPTION_MAP.put("P.03", "对外部对象进行安全检查时需要进行防御性拷贝");
        DESCRIPTION_MAP.put("G.OTH.01", "禁止在日志中保存口令、密钥和其他敏感数据。");
        DESCRIPTION_MAP.put("G.OTH.02", "禁止将敏感信息硬编码在程序中。");
        DESCRIPTION_MAP.put("G.OTH.03", "禁止代码中包含公网地址。");
        DESCRIPTION_MAP.put("G.OTH.04", "不要使用 String 存储敏感数据，敏感数据使用结束后应立即清 0。");
        DESCRIPTION_MAP.put("FFI.C.7", "强制进行指针类型转换时避免出现截断错误。");
    }
}
